package com.team.mp.api.util;

import com.team.mp.mapper.dto.SysPermissionDto;
import com.team.mp.mapper.entity.SysPermission;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * ━━━━━━Feri出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃    邢哥的代码，怎么会，有bug呢，不可能！
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author：邢朋辉
 * @Date: 2023/3/26 14:26
 */
public class MenuUtil {
    /**
     * 转换为菜单的上下级*/
    public static List<SysPermissionDto> ceateMenu(List<SysPermission> list) {
        List<SysPermissionDto> l = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            SysPermission p = list.get(i);
            SysPermissionDto dto=new SysPermissionDto();
            BeanUtils.copyProperties(p,dto);
            //一级菜单或权限
            if (p.getLevel() < 2) {
                l.add(dto);
                if(p.getType()==1) {
                    //实例化对应的二级菜单的集合
                    dto.setChilds(new ArrayList<>());
                }
            } else {
                //子菜单
                //二级菜单
                if (p.getLevel() == 2) {
                    dto.setChilds(new ArrayList<>());
                    for(SysPermissionDto d:l){
                        if(d.getId().equals(p.getParentid())){
                            d.getChilds().add(dto);
                        }
                    }
                } else {
                    //三级菜单
                    for(SysPermissionDto d:l){
                        for (SysPermissionDto d1:d.getChilds()){
                            if(d1.getId().equals(p.getParentid())){
                                d1.getChilds().add(dto);
                            }
                        }
                    }
                }
            }
        }
        return l;
    }

    /**
     * 根据前端模板 生成对应的菜单树*/
    public static List parseMenu(List<SysPermissionDto> list){
        List menus=new ArrayList();

        for(SysPermissionDto dto:list) {
            Map map=new LinkedHashMap();
            map.put("path", dto.getUrl());
            if(StringUtils.hasLength(dto.getPermTag())) {
                map.put("component", dto.getPermTag());
            }
            Map meta = new LinkedHashMap<>();
            meta.put("title", dto.getPermName());
            meta.put("icon", dto.getIcon());
            map.put("meta", meta);
            //验证是否存在子菜单 二级
            if (dto.getChilds() != null && dto.getChilds().size() > 0) {
                //记录对应的二级菜单
                List<Map> children = new ArrayList<Map>();

                map.put("redirect",dto.getChilds().get(0).getUrl());
                for (SysPermissionDto d2 : dto.getChilds()) {
                    Map c1=new LinkedHashMap();
                    c1.put("path", d2.getUrl());
                    c1.put("component", d2.getPermTag());
                    Map meta2 = new LinkedHashMap<>();
                    meta2.put("title", d2.getPermName());
                    meta2.put("icon", d2.getIcon());
                    c1.put("meta", meta2);

                    //验证是否存在子菜单 三级
                    if (d2.getChilds() != null && d2.getChilds().size() > 0) {
                        //记录所属的三级菜单
                        List<Map> children3 = new ArrayList<Map>();
//                        children.put("redirect",d2.getChilds().get(0).getUrl());
                        for (SysPermissionDto d3 : d2.getChilds()) {
                            Map c2=new LinkedHashMap();
                            c2.put("path", d3.getUrl());
                            c2.put("component", d3.getPermTag());
                            Map meta3 = new LinkedHashMap<>();
                            meta3.put("title", d3.getPermName());
                            meta3.put("icon", d3.getIcon());
                            c2.put("meta", meta3);
                            children3.add(c2);
                        }
                        c1.put("children",children3);
                    }
                    children.add(c1);
                }
                map.put("children", children);
            }
            menus.add(map);
        }
        return menus;
    }
}
